﻿using System;
using System.Collections.Generic;
using System.Text;
using Coordenadas;
using System.Collections;
using System.Xml;
using System.Windows.Forms;
using System.Drawing;


namespace MapaMovil
{
    
    public class Emergencia
    {
        //---atributos
        Bitmap iconoEmergencia;
        string nroEmergencia;
        string tipoEmergencia;
        string clave;
        string acto;
        string comandanteIncidente;
        Boolean estaActiva;
        LatLong ubicacion;
        string direccion;
        string esquina;
        string comuna;
        string fechaAlarma;
        string horaAlarma;
        XmlNodeList carrosDespachados;
        XmlNodeList carrosDisponibles;
        ArrayList distanciaEmergencia_CarrosDespachados;
        ArrayList institucionesRequeridas; //CONAF, Carabineros, Hospital, etc
        ArrayList informacionRequerida;//Información del clima, información de gas, aljibe.
        string observacion;
        Configuracion config = new Configuracion();

        //---Constructor
        public Emergencia()
        {

            this.iconoEmergencia = new Bitmap(config.path() + "\\iconos\\" + "emergencia.png");
            this.nroEmergencia = "";
            this.tipoEmergencia = "";
            this.clave = "";
            this.acto = "";
            this.comandanteIncidente = "";
            this.estaActiva = false;
            this.ubicacion=new LatLong();
            this.direccion = "";
            this.esquina = "";
            this.comuna = "";
            this.fechaAlarma="";
            this.horaAlarma="";
            this.carrosDespachados = null;
            this.carrosDisponibles = null;
            this.distanciaEmergencia_CarrosDespachados = new ArrayList();
            this.institucionesRequeridas = new ArrayList(); //CONAF, Carabineros, Hospital, etc
            this.informacionRequerida = new ArrayList();//Información del clima, información de gas, aljibe.
            this.observacion = "";
        } 

        //--- Constructor con parametros
        public Emergencia(string _nroEmergencia, string _tipoEmergencia, string _clave, string _acto, string _comandanteIncidente, Boolean _estaActiva, LatLong _ubicacion, string _direccion, string _esquina, string _comuna, string _fechaAlarma, string _horaAlarma, XmlNodeList _carrosDespachados, XmlNodeList _carrosDisponibles, ArrayList _distanciaEmergencia_CarrosDespachados, ArrayList _institucionesRequeridas, ArrayList _informacionRequerida, string _observacion)
        {
            this.iconoEmergencia = new Bitmap(config.path() + "\\iconos\\" + "emergencia.png");
            this.nroEmergencia = _nroEmergencia;
            this.nroEmergencia = _nroEmergencia;
            this.tipoEmergencia = _tipoEmergencia;
            this.clave = _clave;
            this.acto = _acto;
            this.comandanteIncidente = _comandanteIncidente;
            this.estaActiva = _estaActiva;
            this.ubicacion = _ubicacion;
            this.direccion = _direccion;
            this.esquina = _esquina;
            this.comuna = _comuna;
            this.fechaAlarma = _fechaAlarma;
            this.horaAlarma = _horaAlarma;
            this.carrosDespachados = _carrosDespachados;
            this.carrosDisponibles = _carrosDisponibles;
            this.distanciaEmergencia_CarrosDespachados = _distanciaEmergencia_CarrosDespachados;
            this.institucionesRequeridas = _institucionesRequeridas; //CONAF, Carabineros, Hospital, etc
            this.informacionRequerida = _informacionRequerida;//Información del clima, información de gas, aljibe.
            this.observacion = _observacion;
        }


        //---metodos para la emergencia

        /// <summary>
        /// realiza calculo de distancia de vehículos a la emergencia, sugerir instituciones, etc 
        /// *****determinar informacion necesaria para la emergencia****
        /// </summary>
        public void ProcesarDetalleEmergencia() 
        {
            //procesar distancia de la emergencia a los carros asignados
            ProcesarDistanciaCarros();

            //Procesar Informacion requeridas de acuerdo al tipo de emergencia
            ProcesarInformacionRequerida();
        }

        //calcular la distancia entre el lugar de la emergencia y los carros
        private void ProcesarDistanciaCarros() 
        {
            try
            {
                this.distanciaEmergencia_CarrosDespachados.Clear();
                //calcular distancia de los carros al lugar de la emergencia "en metros"
                for (int i = 0; i < this.carrosDespachados.Count; i++)
                { //---Existe carros asignados a la emergencia
                    string lat, lon;

                    lat = this.carrosDespachados[i].SelectNodes("ubicacion/lat")[0].InnerText;
                    lon = this.carrosDespachados[i].SelectNodes("ubicacion/lon")[0].InnerText;
                    LatLong latlonCar = new LatLong(lat, lon);

                    double dist =  Utiles.distancia(this.ubicacion, latlonCar);
                    //FormatNumber
                    //MessageBox.Show(dist.ToString());
                    this.distanciaEmergencia_CarrosDespachados.Add(dist.ToString("#0"));
                }
            }
            catch  (Exception ee)
            {
                MessageBox.Show(ee.Message);
            }

        }


        //Determinar la informacion requerida de acuerdo al tip de emergencia
        private void ProcesarInformacionRequerida()
        {
            //MessageBox.Show(this.clave);
            this.institucionesRequeridas.Clear();
            this.informacionRequerida.Clear();

            switch (this.clave)
            {
                case "10-0":        
                    this.institucionesRequeridas.Add("Carabineros");
                    this.informacionRequerida.Add("demoinfo");
                    
                    break;

                case "10-1":

                    break;

                case "10-2":
                    this.institucionesRequeridas.Add("CONAF");
                    this.institucionesRequeridas.Add("ONEMI");

                    this.informacionRequerida.Add("Viento");
                    this.informacionRequerida.Add("Humedad");
                    this.informacionRequerida.Add("aljibe");

                    break;

                case "10-3":
                    this.institucionesRequeridas.Add("Ambulancia");
                    this.institucionesRequeridas.Add("Carabineros");
                    break;

                case "10-4":
                    break;

                case "10-5":
                    this.institucionesRequeridas.Add("Carabineros");
                    this.institucionesRequeridas.Add("Metrogas");
                    this.institucionesRequeridas.Add("Ambulancia");

                    break;

                case "10-6":
                    this.institucionesRequeridas.Add("Metrogas");
                    this.institucionesRequeridas.Add("Carabineros");
                    this.institucionesRequeridas.Add("Ambulancia");
                    break;

                case "10-7":
                    this.institucionesRequeridas.Add("Chilectra");
                    this.institucionesRequeridas.Add("Carabineros");
                    this.institucionesRequeridas.Add("Ambulancia");

                    break;

                case "10-8":

                    break;

                case "10-9":
                    break;

                case "10-10":
                    this.institucionesRequeridas.Add("CONAF");
                    this.institucionesRequeridas.Add("ONEMI");

                    this.informacionRequerida.Add("Viento");
                    this.informacionRequerida.Add("Humedad");
                    this.informacionRequerida.Add("aljibe");

                    break;

                case "10-11":
                    break;

                case "10-12":
                    break;

                case "10-13":
                    break;

                case "10-14":
                    break;

                case "10-15":
                    break;

                //por default
                default:
                    break;

            }
        }




        //---Getters y Setters-------------
        public string NroEmergencia
        {
            get { return this.nroEmergencia; }
            set { this.nroEmergencia = value; }
        }
        public LatLong Ubicacion 
        {
            get { return this.ubicacion; }
            set {this.ubicacion=value;}
        }
        public string Direccion
        {
            get { return this.direccion; }
            set { this.direccion = value; }
        }
        public string FechaAlarma
        {
            get { return this.fechaAlarma; }
            set { this.fechaAlarma = value; }
        }

        public string HoraAlarma
        {
            get { return this.horaAlarma; }
            set { this.horaAlarma = value; }
        }

        public string Acto
        {
            get { return this.acto; }
            set { this.acto = value; }
        }

        public string Clave
        {
            get { return this.clave; }
            set { this.clave = value; }
        }

        public string Observacion
        {
            get { return this.observacion; }
            set { this.observacion = value; }
        }

        public XmlNodeList CarrosDespachados
        {
            get { return this.carrosDespachados; }
            set { this.carrosDespachados = value; }
        }

        public override string ToString()
        {
                  
            //agregar informacion de la emergencia
                string resultado= "Clave:" + Clave + "\nDireccion:" + Direccion + "\nHora" + HoraAlarma + "\nObs.:" + Observacion;

            //agregar informacion de los carros que asisten a la emergencia
                resultado = resultado + ("\nCARROS, HoraDespacho,estado,distancia(m)");
                for (int k = 0; k < this.carrosDespachados.Count; k++) 
                {
                    string carro,horadespacho,estado,distToemergencia;
                    carro = this.carrosDespachados[k].SelectNodes("nombrecarro")[0].InnerText;
                    horadespacho = this.carrosDespachados[k].SelectNodes("horadespacho")[0].InnerText;
                    estado = this.carrosDespachados[k].SelectNodes("estado")[0].InnerText;
                    distToemergencia = distanciaEmergencia_CarrosDespachados[k].ToString();
                    resultado = resultado + ("\n" + carro + "; " + horadespacho + "; " + estado + "; " + distToemergencia);
                }

                //agregar informacion de información adicional de acuerdo al tipo de emergencia.
                resultado = resultado + ("\nPuede Requerir Instituciones:");
                for (int k = 0; k < this.institucionesRequeridas.Count; k++)
                {
                    resultado = resultado + ("\n" + this.institucionesRequeridas[k].ToString() );
                }

                resultado = resultado + ("\nPuede Requerir Informacion:");
                for (int k = 0; k < this.informacionRequerida.Count; k++)
                {
                    resultado = resultado + ("\n" + this.informacionRequerida[k].ToString());
                }

                return resultado;
        }

        public void MostrarEnPanel() 
        {
            FormMostrarEmergencia formMostrarEmerg = new FormMostrarEmergencia(this.acto,this.clave,this.direccion,this.esquina,this.fechaAlarma,this.horaAlarma,this.carrosDespachados,this.distanciaEmergencia_CarrosDespachados,this.institucionesRequeridas,this.informacionRequerida);
            formMostrarEmerg.ShowDialog();            
            
        }
        public Bitmap IconoEmergencia 
        {
            get { return this.iconoEmergencia; }
            set { this.iconoEmergencia = value; }
        }


    }

 
}
